import {login,logout,refreshToken} from '@/api/auth'
import {PcCookie,Key} from '@/utils/cookie'
const state = {
    userInfo:PcCookie.get(Key.userInfoKey) ? JSON.parse(PcCookie.get(Key.userInfoKey)):null, // ←左边这项表示“用户基本信息”
    accessToken:PcCookie.get(Key.accessTokenKey), // ←左边这项表示“访问令牌”
    refreshToken:PcCookie.get(Key.refreshTokenKey) // ←左边这项表示“刷新令牌”，其作用是“在访问令牌过期时通过它去获取新的访问令牌”（当访问令牌过期、无效时，后台会响应错误码“405”（表示“未认证”））
}
// 改变状态值（向状态赋值）
const mutations = {
    // 给用户状态赋值
    SET_USER_STATE(state,data){
        // state.userInfo = data.userInfo
        // state.accessToken = data.access_token
        // state.refreshToken = data.refresh_token
        // 解构对象属性↓
        const {userInfo,access_token,refresh_token} = data // ←注：左边这项采用了“解构赋值”的形式（具体为返回的“response.data”中的“userInfo”、“access_token”和“refresh_token”的值被赋值给了“{userInfo,access_token,refresh_token}”中的“userInfo”、“access_token”和“refresh_token”）
        // 给用户状态赋值↓
        state.userInfo = userInfo
        state.accessToken = access_token
        state.refreshToken = refresh_token
        // 将数据保存到cookie中
        PcCookie.set(Key.userInfoKey,userInfo)
        PcCookie.set(Key.accessTokenKey,access_token)
        PcCookie.set(Key.refreshTokenKey,refresh_token)
    },
    // 重置用户状态
    RESET_USER_STATE(state){
        state.userInfo = null
        state.accessToken = null
        state.refreshToken = null
        // 移除cookie中的数据
        PcCookie.remove(Key.userInfoKey)
        PcCookie.remove(Key.accessTokenKey)
        PcCookie.remove(Key.refreshTokenKey)
    }
}
// “actions”的最主要的作用是“定义行为”
const actions = {
    UserLogin({commit},userInfo){
        console.log('UserLogin',userInfo)
        const{username,password} = userInfo // ←注：左边这项采用了“解构赋值”的形式（具体为返回的“response.data.userInfo”中的“username”和“password”的值被赋值给了“{username,password}”中的“username”和“password”）
        return new Promise((resolve,reject) => {
            // login({username:username.trim(),password：password}) // ←注：左边这行中“password:pasword”是下面这行中的“password”在“ES5”中的完整写法↓
            login({username:username.trim(),password}).then(response => {
                console.log('response',response)
                const {code,data} = response
                if (code === 20000) {
                    // 给用户状态赋值
                    commit('SET_USER_STATE', data)
                }
                resolve(response) // ←注：左边这项是“正常响应的钩子”
            }).catch(error => {
                // 重置用户状态
                commit('RESET_USER_STATE')
                reject(error) // ←注：左边这项是“在出现异常时响应的钩子”
            })
        })
    },
    // 退出
    UserLogout({state,commit},redirectURL){
        logout(state.accessToken).then(response => {
            // 重置用户状态
            commit('RESET_USER_STATE')
            // 重定向回到来源地址，或在“redirectURL”未被传值（即未指定重定向地址）的情况下重定向到登录页面
            window.location.href = redirectURL || '/'
        }).catch(error => {
            commit('RESET_USER_STATE')
            window.location.href = redirectURL || '/'
        })
    },
    // 发送刷新令牌
    SendRefreshToken({state,commit}){
        return new Promise((resolve,reject) => {
            // 调用接口
            if (!state.refreshToken) {
                // 重置用户状态
                commit('RESET_USER_STATE')
                reject('没有刷新令牌')
                return
            }
            // 发送请求
            refreshToken(state.refreshToken).then(response => {
                console.log('获取到的新的身份认证信息',response.data)
                // 为用户状态更新数据
                commit('SET_USER_STATE', response.data)
                // resolve(response) // ←注：1.左边这项表示“正常情况下响应的钩子”，对应的是“refresh.vue”中的“methods:refreshLogin(){}”中的“.then()”中的代码（即“response => {}”这一部分的代码）；2.因为“response”在通过刷新令牌获取新的认证信息时没什么用，所以在此处不用把“response”作为参数传递过来
                resolve()
            }).catch(error => {
                // 重置用户状态
                commit('RESET_USER_STATE')
                reject(error)
            })
        })
    }
}
export default{state,mutations,actions}